package service.impl;

import global.Constants;
import global.security.SessionUtils;

import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import service.DocumentService;
import util.DateUtils;
import util.FileUtils;
import util.StringUtils;
import dao.DocumentDAO;
import domain.Document;

/**
 * 文档Service实现类.
 * <p>
 * 创建日期：2010-07-01<br>
 * 创建人：Xiyt<br>
 * 修改日期：<br>
 * 修改人：<br>
 * 修改内容：<br>
 * 
 * @author Xiyt
 * @version 1.0
 */
public class DocumentServiceImpl implements DocumentService {

	/**
	 * 文档Dao
	 * */
	private DocumentDAO documentDao = null;

	/**
	 * 设定文档Dao
	 * */
	public void setDocumentDao(DocumentDAO documentDao) {
		this.documentDao = documentDao;
	}

	/**
	 * 查询分类数量
	 * @param paramDocument 文档
	 * @return int 分类数量
	 */
	public int countByCriteria(Document paramDocument) {
		paramDocument = getConditions(paramDocument);
		int count = documentDao.countByCriteria(paramDocument);
		return count;
	}
	
	/**
	 * 获得文档
	 * @param documentId 文档ID
	 * @return Document 文档
	 */
	public Document selectByPrimaryKey(Integer documentId){
		return documentDao.selectByPrimaryKey(documentId);
	}

	/**
	 * 查询文档列表
	 * @param paramDocument 文档
	 * @return List 文档列表
	 */
	public List<Document> selectByCriteria(Document paramDocument) {
		// 查询文档列表
		paramDocument = getConditions(paramDocument);
		List<Document> documentList = documentDao.selectByCriteria(paramDocument);
		if (documentList != null && documentList.size() != 0) {
			return documentList;
		} else {
			return null;
		}
	}

	/**
	 * 查询文档列表带分页
	 * @param paramDocument 文档
	 * @return List 文档列表
	 */
	public List<Document> selectByCriteriaForPaging(Document paramDocument) {
		// 查询文档列表
		paramDocument = getConditions(paramDocument);
		List<Document> documentList = documentDao.selectByCriteriaForPaging(
				paramDocument, paramDocument.getStart(), paramDocument.getLimit());
		if (documentList != null && documentList.size() != 0) {
			List<Document> resultList = new ArrayList<Document>();
			for (Document document : documentList) {
				// 日期
				document.setCreateDateStr(DateUtils.formatDate2Str(document.getCreateTime()));
				resultList.add(document);
			}
			return resultList;
		} else {
			return null;
		}
	}
	
	/**
	 * 查询文档树
	 * @param parentId 文档ID
	 * @return JSONArray 文档树
	 */
	public JSONArray selectDocumentForTree(String parentId){
		JSONArray res = new JSONArray();
		// 设定条件
		Document paramDocument = new Document();
		if(StringUtils.isNotEmpty(parentId)){
			paramDocument.setParentId(Integer.parseInt(parentId));
		}
		// 取得笔记分类列表
		List<Document> documentList = new ArrayList<Document>();
		documentList = this.selectByCriteria(paramDocument);
		res = getDocumentTreeFromList(documentList, parentId);
		return res;
	}

	/**
	 * 添加文档
	 * @param paramDocument 文档
	 */
	public void insert(Document document) {
		// 删除区分：未删除
		document.setDelflag(Constants.DEL_FLAG_1);
		// 系统时间
		Timestamp sysdate = new Timestamp(System.currentTimeMillis());
		document.setCreateUser(SessionUtils.getCurrentUserId());
		document.setCreateTime(sysdate);
		document.setUpdateUser(SessionUtils.getCurrentUserId());
		document.setUpdateTime(sysdate);
		documentDao.insert(document);
	}

	/**
	 * 修改文档
	 * @param paramDocument 文档
	 */
	public void update(Document document) {
		// 系统时间
		Timestamp sysdate = new Timestamp(System.currentTimeMillis());
		document.setUpdateUser(SessionUtils.getCurrentUserId());
		document.setUpdateTime(sysdate);
		documentDao.updateByPrimaryKey(document);
	}

	/**
	 * 删除文档
	 * @param documentIds 文档IDS
	 * @param uploadFilePath 文件上传路径
	 * @throws Exception 
	 */
	public void delete(String documentIds, String uploadFilePath) throws Exception {
		String[] documentIdArr = documentIds.split(",");
		for(int i=0;i<documentIdArr.length;i++){
			// 取得文档列表
			List<Document> documentList = new ArrayList<Document>();
			// 递归查询文档
			Document parentDocument = new Document();
			if("0".equals(documentIdArr[i])){// 根目录
				parentDocument.setDocumentId(0);
			}else{
				parentDocument = this.selectByPrimaryKey(Integer.parseInt(documentIdArr[i]));
			}
			getDocumentList(parentDocument, documentList);
			
			for (Document document : documentList) {
				if("1".equals(document.getIsleaf())){
					// 删除磁盘文档
					FileUtils.delete(uploadFilePath + "/" + document.getLink());
				}
				// 删除文档
				documentDao.deleteByPrimaryKey(document.getDocumentId());
			}
		}
	}
	
	/**
	 * 移动文档
	 * @param documentIds 文档IDS
	 * @param parentId 移动的位置ID
	 */
	public void move(String documentIds, String parentId){
		String[] documentIdArr = documentIds.split(",");
		for(int i=0;i<documentIdArr.length;i++){
			Document document = new Document();
			document.setDocumentId(Integer.parseInt(documentIdArr[i]));
			document.setParentId(Integer.parseInt(parentId));
			// 更新文档
			this.update(document);
		}
	}
	

	/**
	 * 返回文档树
	 * 
	 * @param documentList
	 * @return
	 */
	private JSONArray getDocumentTreeFromList(List<Document> documentList, String parentId) {
		JSONArray results = new JSONArray();
		if("-1".equals(parentId)){
			JSONObject document = new JSONObject();
			document.put("id", "0");
			document.put("text", "我的文档");
			document.put("leaf", false);
			results.add(document);
		}else{
			if (null != documentList) {
				for (int i = 0; i < documentList.size(); i++) {
					if(documentList.get(i).getIsleaf().equals("0")){
						JSONObject documentNode = new JSONObject();
						documentNode.put("id", documentList.get(i).getDocumentId());
						documentNode.put("text", documentList.get(i).getDocumentName());
						documentNode.put("leaf", Constants.ISLEAF_MAP.get(documentList.get(i).getIsleaf()));
						results.add(documentNode);
					}
				}
			}
		}
		return results;
	}
	
	/**
	 * 递归查询文档
	 * 
	 * @param parentDocument 文档
	 * @param documentList 文档列表
	 * @return
	 */
	private void getDocumentList(Document parentDocument, List<Document> documentList){
		// 添加本相册
		documentList.add(parentDocument);
		// 递归查询子相册
		Document paramDocument = new Document();
		paramDocument.setParentId(parentDocument.getDocumentId());
		List<Document> newDocumentList = this.selectByCriteria(paramDocument);
		if(null != newDocumentList){
			for(int i=0;i<newDocumentList.size();i++){
				getDocumentList(newDocumentList.get(i), documentList);
			}
		}
	}
	
	/**
	 * 设置公共参数
	 * @param parentDocument 参数对象
	 */
	private Document getConditions(Document parentDocument){
		parentDocument.setCreateUser(SessionUtils.getCurrentUserId());// 当前用户
		return parentDocument;
	}
}
